#pragma once

#include <unistd.h>

#ifdef _WIN32  
    // Windows平台的代码  
    #include <ws2tcpip.h>  
    
    // #include <WinSock2.h>
    // 这个使用 MinGW 编译器会报错：
    // 1. ws2_32.lib 是 MSVC 的导入库，而 MinGW 中的是 libws2_32.a。 所以在 CMake 中引用可以掐头去尾使用 ws2_32
    // 2. #pragma comment(lib, "ws2_32.lib") 这样的预处理命令是 MSVC 专有的表达式，MinGW 中没有。所以当我们使用 VS 中的 cl 编译器时可以这样做，但是换成 MinGW G++ 编译器则不行 
    // 解决方法:
    // 1. 需要在 pro 文件内 加入 LIBS += -lws2_32 即可
    // 2. 在 CMake 中引用 link_libraries(ws2_32) 或者 target_link_libraries(生成文件名 ws2_32)
    // 3. 在使用编译命令时加上 gcc prog.c -o prog -lws2_32 这里的 -l 指的编译链接库文件，不管是第一种还是第二种在脚本配置种配置，其目的都是变成调用第三种方式
    // #pragma comment(lib, "ws2_32.lib")

    typedef int addrlen;
#endif

#ifdef __linux__  
    // Linux平台的代码  
    #include <arpa/inet.h>
    #include <string.h>

    typedef int SOCKET;
    typedef socklen_t addrlen;
#endif

#ifdef __APPLE__  
    #ifdef __MACH__  
        // macOS平台的代码  
        #include <arpa/inet.h>
        #include <string.h>
        
        // #include <sys/types.h>  
        // #include <sys/socket.h>  
        // #include <netinet/in.h>  
        // #include <netdb.h>  

        typedef int SOCKET;
        typedef socklen_t addrlen;
    #endif  
#endif


inline int compatCloseSocket(SOCKET socket) {
#ifndef _WIN32
    // linux 下需要这样做，本质 close 和 closesocket 是一样的，另外对于 windows 网络库并不是系统的标准需要加载。
    return close(socket);
#endif
    
#ifdef _WIN32
    // windows 平台下需要这样做
    return closesocket(socket);
#endif
}